package com.teacher.game.model;

import android.graphics.Rect;
import com.teacher.game.framework.util.RandomNumberGenerator;

/**
 * 障碍物模型类 - 实现跑酷游戏中的障碍物
 * 功能：移动、碰撞检测、高度随机、循环复用
 * 优化：添加对象池支持，减少GC压力
 */
public class Block {
    private float x, y;
    private int width, height;
    
    // 碰撞和计分相关
    private boolean isPassed = false;    // 是否已被玩家越过（用于计分）
    private boolean isActive = true;     // 是否激活（用于优化）
    
    // 优化：复用碰撞检测矩形
    private Rect collisionRect = new Rect();

    /**
     * 构造函数
     * @param x 初始X坐标
     * @param y 初始Y坐标
     * @param width 宽度
     * @param height 高度
     */
    public Block(float x, float y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.isPassed = false;
        this.isActive = true;
    }

    /**
     * 更新障碍物状态
     * @param delta 时间增量
     * @param blockSpeed 移动速度（负值向左移动）
     */
    public void update(float delta, int blockSpeed) {
        // 水平移动
        x += blockSpeed * delta;
        
        // 当障碍物移出屏幕左侧时，重置到右侧
        if (x <= -width) {
            resetPosition();
        }
    }
    
    /**
     * 重置障碍物位置和状态
     */
    private void resetPosition() {
        x += 1000; // 重置到屏幕右侧
        
        // 随机设置高度 - 重新设计障碍物生成逻辑
        if ((RandomNumberGenerator.getRandInt(3)) == 0) {
            y = 330; // 高位置（需要跳跃）- 空中障碍物
        } else {
            y = 390; // 低位置（需要下蹲）- 地面障碍物
        }
        
        // 重置状态
        isPassed = false;
        isActive = true;
    }

    /**
     * 获取碰撞矩形 - 用于碰撞检测（优化版本 - 复用对象）
     * @return 障碍物的碰撞盒
     */
    public Rect getCollisionRect() {
        collisionRect.set(
            (int)x, 
            (int)y, 
            (int)x + width, 
            (int)y + height
        );
        return collisionRect;
    }
    
    /**
     * 检查障碍物是否在屏幕内
     * @param screenWidth 屏幕宽度
     * @return 是否在屏幕内
     */
    public boolean isOnScreen(int screenWidth) {
        return x > -width && x < screenWidth;
    }
    
    /**
     * 检查障碍物是否需要跳跃才能越过
     * @return 是否为高位障碍物
     */
    public boolean requiresJump() {
        return y <= 360; // 高度阈值调整 - 空中障碍物需要跳跃
    }
    
    /**
     * 检查障碍物是否需要下蹲才能越过
     * @return 是否为低位障碍物
     */
    public boolean requiresDuck() {
        return y > 300;
    }

    // === Getter和Setter方法 ===
    
    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }
    
    public boolean isPassed() {
        return isPassed;
    }
    
    public void setPassed(boolean passed) {
        this.isPassed = passed;
    }
    
    public boolean isActive() {
        return isActive;
    }
    
    public void setActive(boolean active) {
        this.isActive = active;
    }
    
    /**
     * 设置障碍物位置
     * @param x X坐标
     * @param y Y坐标
     */
    public void setPosition(float x, float y) {
        this.x = x;
        this.y = y;
    }
    
    /**
     * 获取障碍物中心点X坐标
     * @return 中心点X坐标
     */
    public float getCenterX() {
        return x + width / 2f;
    }
    
    /**
     * 获取障碍物中心点Y坐标
     * @return 中心点Y坐标
     */
    public float getCenterY() {
        return y + height / 2f;
    }
    
    /**
     * 获取障碍物右边缘X坐标
     * @return 右边缘X坐标
     */
    public float getRightEdge() {
        return x + width;
    }
    
    /**
     * 重置障碍物到对象池可用状态
     * 优化：用于对象池回收时重置对象状态
     */
    public void resetToPool() {
        isPassed = false;
        isActive = true;
    }
    
    /**
     * 获取障碍物底边Y坐标
     * @return 底边Y坐标
     */
    public float getBottomEdge() {
        return y + height;
    }
}
